/*-------------------------------------------------------------------------
 *
 * execdesc.h
 *	  执行器和相关模块使用的计划和查询描述符访问宏。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/executor/execdesc.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef EXECDESC_H
#define EXECDESC_H

#include "nodes/execnodes.h"
#include "tcop/dest.h"


/* ----------------
 *		查询描述符：
 *
 *	QueryDesc 封装执行查询所需的所有信息。
 *
 *	为了方便 SQL 语言函数，我们还支持包含实用语句的 QueryDescs；
 *	不过，这些不能传递给执行器。
 * ---------------------
 */
typedef struct QueryDesc
{
	/* 这些字段由 CreateQueryDesc 提供 */
	CmdType		operation;		/* CMD_SELECT, CMD_UPDATE 等 */
	PlannedStmt *plannedstmt;	/* 规划者的输出（也可能是实用的） */
	const char *sourceText;		/* 查询的源文本 */
	Snapshot	snapshot;		/* 用于查询的快照 */
	Snapshot	crosscheck_snapshot;	/* 用于 RI 更新/删除的交叉检查 */
	DestReceiver *dest;			/* 元组输出的目标 */
	ParamListInfo params;		/* 被传入的参数值 */
	QueryEnvironment *queryEnv; /* 被传入的查询环境 */
	int			instrument_options; /* InstrumentOption 标志的或运算 */

	/* 这些字段由 ExecutorStart 设置 */
	TupleDesc	tupDesc;		/* 结果元组的描述符 */
	EState	   *estate;			/* 执行器的查询范围状态 */
	PlanState  *planstate;		/* 每个计划节点状态的树 */

	/* 此字段由 ExecutePlan 设置 */
	bool		already_executed;	/* 如果先前执行则为真 */

	/* 这始终由核心系统设置为 NULL，但插件可以更改它 */
	struct Instrumentation *totaltime;	/* 在 ExecutorRun 中花费的总时间 */
} QueryDesc;

/* 在 pquery.c 中 */
extern QueryDesc *CreateQueryDesc(PlannedStmt *plannedstmt,
								  const char *sourceText,
								  Snapshot snapshot,
								  Snapshot crosscheck_snapshot,
								  DestReceiver *dest,
								  ParamListInfo params,
								  QueryEnvironment *queryEnv,
								  int instrument_options);

extern void FreeQueryDesc(QueryDesc *qdesc);

#endif							/* EXECDESC_H  */
